/* eslint-disable */
const Service = require('egg').Service;
const { Op } = require('sequelize');
const moment = require('moment');

class CaptchaService extends Service {
    async generateCode(username) {
        const { ctx } = this;

        // 生成一个随机的数学题目
        const questionData = this._generateMathQuestion();
        const { question, result } = questionData;

        // 设置验证码的过期时间为5分钟
        const expiresAt = moment().add(5, 'minutes').toDate();

        // 存储到数据库
        const code = await ctx.model.Code.create({
            username,
            code: question,   // 存储数学题目
            result,
            expires_at: expiresAt,
        });
        console.log('生成并存储的验证码:', code);
        return { question: code.code, expires_at: expiresAt }; // 返回题目和过期时间
    }

    // 验证验证码
    async validateCode(username, answer) {
        const { ctx } = this;

        // 查找数据库中存储的验证码
        const captcha = await ctx.model.Code.findOne({
            where: {
                username,
                expires_at: { [Op.gt]: moment().toDate() },  // 验证码未过期
            },
            order: [['created_at', 'DESC']], // 取最新的验证码
        });
        console.log('验证查询结果:', captcha);
        console.log('当前时间:', moment().toDate());
        console.log('验证码过期时间:', captcha.expires_at);

        if (!captcha) {
            // 处理过期的验证码：删除过期验证码并返回新验证码
            const newCaptcha = await this._handleExpiredCaptcha(username);
            // 返回新的验证码和过期时间
            return {
                message: '验证码已过期，请重新获取验证码',
                newCaptcha: newCaptcha.question,
                expires_at: newCaptcha.expires_at
            };
        }

        // 验证验证码是否过期
        if (new Date() > new Date(captcha.expires_at)) {
            throw new Error('验证码已过期');
        }


        console.log('用户输入的答案:', answer);
        console.log('存储的正确答案:', captcha.result);
        console.log('答案类型:', typeof answer, typeof captcha.result);
        // 检查用户输入的答案是否与计算结果匹配
        if (parseFloat(answer) !== parseFloat(captcha.result)) {
            throw new Error('验证码验证失败，答案错误');
        }

        // 验证通过，删除验证码记录
        await ctx.model.Code.destroy({
            where: {
                username: captcha.username,
                id: captcha.id,
            }
        });

        return true;
    }
    // 处理验证码过期的情况
    async _handleExpiredCaptcha(username) {
        const { ctx } = this;

        // 删除过期的验证码
        await ctx.model.Code.destroy({
            where: {
                username,
                expires_at: { [Op.lt]: moment().toDate() },  // 查找过期的验证码
            },
        });

        // 生成新的验证码
        return this.generateCode(username);
    }
    // 生成随机的数学题目
    _generateMathQuestion() {
        const operators = ['+', '-', '*', '/'];
        const operator = operators[Math.floor(Math.random() * operators.length)];
        const num1 = Math.floor(Math.random() * 100);
        const num2 = Math.floor(Math.random() * 100);

        let question = `${num1} ${operator} ${num2}`;
        let result;

        const operatorMap = {
            '+': (a, b) => a + b,
            '-': (a, b) => a - b,
            '*': (a, b) => a * b,
            '/': (a, b) => (b !== 0 ? a / b : 0),  // 防止除以0
        };

        // 获取运算结果
        result = operatorMap[operator](num1, num2);

        // 格式化为整数
        if (operator === '/') {
            question = `${num1} ÷ ${num2}`;
            result = Math.round(result);  // 四舍五入为整数
        }

        return { question, result };
    }
}

module.exports = CaptchaService;